package com.lpf.grpc;

import io.grpc.Server;
import io.grpc.ServerBuilder;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * 功能描述：服务端
 *
 * 编写方式参考：《笔记.docx》中 22_gRPC实践
 * 按照官方文档的示例做了一遍：https://www.grpc.io/docs/quickstart/java/
 *
 * @author: lpf
 * @date: 2019/6/21 17:25
 * @version: 1.0
 */
public class GrpcServer {

    private Server server;

    // 启动服务器
    private void start() throws IOException {

        // 初始化server对象
        this.server = ServerBuilder
                .forPort(8899)
                .addService(new StudentServiceImpl()) // 增加服务器端真正处理业务逻辑的实例
                .build()
                .start();

        System.out.println("server started!");

        // Pocess finished with exit code 0 零表示正常退出
        // 添加JVM回调钩子
        // 使用带参数的awaitTermination方法可以看到效果[awaitTermination(long timeout, TimeUnit unit)]
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("关闭jvm");
            GrpcServer.this.stop();
        }));

        System.out.println("执行到这里");
    }

    // 关闭服务器
    private void stop() {
        if (this.server != null) {
            this.server.shutdown();
        }
    }

    // 阻塞程序不退出
    private void awaitTermination() throws InterruptedException {
        if (this.server != null) {
            // 等待server终止
            this.server.awaitTermination();
            // 在指定时间内等待server终止，查过这个时间就不等了，那么server就会退出
            //this.server.awaitTermination(3000, TimeUnit.MILLISECONDS);
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        GrpcServer server = new GrpcServer();
        server.start();
        server.awaitTermination(); // 不加这行代码，服务一启动就会退出，不会阻塞等待
    }
}
